package com.zr.service.sys.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zr.dao.sys.SysRoleAuthDao;
import com.zr.dao.sys.SysRoleDao;
import com.zr.dao.sys.SysUserRoleDao;
import com.zr.service.sys.SysRoleService;
import com.zr.utils.TokenUtil;
import com.zr.vo.sys.SysAuth;
import com.zr.vo.sys.SysRole;
import com.zr.vo.sys.SysRoleAuth;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 角色操作 服务层实现类
 */
@Service
public class SysRoleServiceImpl implements SysRoleService {

    @Resource
    private SysRoleDao sysRoleDao;

    @Resource
    private SysUserRoleDao sysUserRoleDao;

    @Resource
    private SysRoleAuthDao sysRoleAuthDao;

    @Resource
    private TokenUtil tokenUtil;

    /**
     * 条件查询角色列表
     * @param sysRole
     * @return
     */
    @Override
    public PageInfo<SysRole> list(SysRole sysRole) {
        PageHelper.startPage(sysRole.getPageNum(), sysRole.getPageSize());
        List<SysRole> sysRoleList = sysRoleDao.list(sysRole);
        return new PageInfo<SysRole>(sysRoleList);
    }

    /**
     * 新增角色
     * @param sysRole
     * @return
     */
    @Transactional
    @Override
    public int add(SysRole sysRole) {
        sysRole.setCreateId(tokenUtil.currentUserId());
        sysRole.setCreateTime(new Date());
        int count = sysRoleDao.insertSelective(sysRole);
        //增加中间表
        insertSysAuthList(sysRole);
        return count;
    }

    /**
     * 编辑角色
     * @param sysRole
     * @return
     */
    @Transactional
    @Override
    public int edit(SysRole sysRole) {
        sysRole.setModifyId(tokenUtil.currentUserId());
        sysRole.setModifyTime(new Date());
        //删除角色拥有的权限
        sysRoleAuthDao.deleteByRoleId(sysRole.getId());
        //增加中间表
        insertSysAuthList(sysRole);
        return sysRoleDao.updateByPrimaryKeySelective(sysRole);
    }


    /**
     * 删除角色
     * @param id
     * @return
     */
    @Transactional
    @Override
    public int remove(Integer id) {
        //先删除用户角色表
        sysUserRoleDao.deleteByRoleId(id);
        //再删除角色权限表
        sysRoleAuthDao.deleteByRoleId(id);
        //删除角色表
        return sysRoleDao.deleteByPrimaryKey(id);


    }

    /**
     * 查询所有角色
     * @return
     */
    @Override
    public List<SysRole> listAll() {
        return sysRoleDao.listAll();
    }

    /**
     * 批量新增角色拥有的权限
     * @param sysRole
     */
    private void insertSysAuthList(SysRole sysRole){
        if(sysRole.getSysAuthList().size() != 0){
            for(SysAuth sysAuth : sysRole.getSysAuthList()){
                SysRoleAuth sysRoleAuth = new SysRoleAuth();
                sysRoleAuth.setRoleId(sysRole.getId());
                sysRoleAuth.setAuthId(sysAuth.getId());
                sysRoleAuthDao.insertSelective(sysRoleAuth);
            }
        }
    }
}
